﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using TISModel;
using BTO;

namespace DAL
{
    public class DALReserva
    {
        public List<BTO.Reserva> list()
        {
            //Pesquisa dados
            var reservasEntities = new TISModel.TISEntities();

            //cria modelos e add na lista para retornar
            var reservas = (from c in reservasEntities.Reserva
                            select new BTO.Reserva
                            {
                                IDReserva = c.IDReserva,
                                IDCliente = c.IDCliente,
                                IDPartida = c.IDPartida,
                                IDChegada = c.IDChegada,
                                IDTransporteIda = c.IDTransporteIda,
                                IDTransporteVolta = c.IDTransporteVolta,
                                IDAgencia = c.IDAgencia,
                                IDAlojamento = c.IDAlojamento,
                                nrPessoas = c.nrPessoas,
                                dataReserva = c.dataReserva,
                                dataPartida = c.dataPartida,
                                dataChegada = c.dataChegada

                            }).ToList();

            return reservas;
        }

        public BTO.Reserva getByID(int id)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reserva = (from c in reservasEntities.Reserva
                           where c.IDReserva == id
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda =  c.IDTransporteIda,
                               IDTransporteVolta =  c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).FirstOrDefault();

            return reserva;

        }

        public List<BTO.Reserva> getByIDChegada(int id)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reserva = (from c in reservasEntities.Reserva
                           where c.IDChegada == id
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reserva;

        }

        public List<BTO.Reserva> getByIDAlojamento(int id)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reserva = (from c in reservasEntities.Reserva
                           where c.IDAlojamento == id
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reserva;

        }

        public List<BTO.Reserva> getByIDPartida(int id)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reserva = (from c in reservasEntities.Reserva
                           where c.IDChegada == id
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reserva;

        }

        public List<BTO.Reserva> getByIDTransporteIda(int id)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reserva = (from c in reservasEntities.Reserva
                           where c.IDTransporteIda == id
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reserva;

        }

        public List<BTO.Reserva> getByIDTransporteVolta(int? id)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reserva = (from c in reservasEntities.Reserva
                           where c.IDTransporteVolta == id
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reserva;

        }

        public List<BTO.Reserva> getByCliente(int idCliente)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            
            var reservas = (from c in reservasEntities.Reserva
                           where c.IDCliente == idCliente
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reservas;
        }

        public List<BTO.Reserva> getByAgencia(int idAgencia)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reservas = (from c in reservasEntities.Reserva
                           where c.IDAgencia == idAgencia
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda =  c.IDTransporteIda,
                               IDTransporteVolta =  c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reservas;
        }

        public List<BTO.Reserva> getByDataReserva(DateTime dataReserva)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reservas = (from c in reservasEntities.Reserva
                           where c.dataReserva == dataReserva
                           select new BTO.Reserva
                           {
                               IDReserva = c.IDReserva,
                               IDCliente = c.IDCliente,
                               IDPartida = c.IDPartida,
                               IDChegada = c.IDChegada,
                               IDTransporteIda = c.IDTransporteIda,
                               IDTransporteVolta = c.IDTransporteVolta,
                               IDAgencia = c.IDAgencia,
                               IDAlojamento = c.IDAlojamento,
                               nrPessoas = c.nrPessoas,
                               dataReserva = c.dataReserva,
                               dataPartida = c.dataPartida,
                               dataChegada = c.dataChegada

                           }).ToList();

            return reservas;
        }

        public List<BTO.Reserva> getByDataPartida(DateTime data)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reservas = (from c in reservasEntities.Reserva
                            where c.dataPartida == data
                            select new BTO.Reserva
                            {
                                IDReserva = c.IDReserva,
                                IDCliente = c.IDCliente,
                                IDPartida = c.IDPartida,
                                IDChegada = c.IDChegada,
                                IDTransporteIda = c.IDTransporteIda,
                                IDTransporteVolta = c.IDTransporteVolta,
                                IDAgencia = c.IDAgencia,
                                IDAlojamento = c.IDAlojamento,
                                nrPessoas = c.nrPessoas,
                                dataReserva = c.dataReserva,
                                dataPartida = c.dataPartida,
                                dataChegada = c.dataChegada

                            }).ToList();

            return reservas;
        }

        public List<BTO.Reserva> getByDataChegada(DateTime data)
        {
            //Pesquisa dados e cria modelo para retornar
            var reservasEntities = new TISModel.TISEntities();
            var reservas = (from c in reservasEntities.Reserva
                            where c.dataPartida == data
                            select new BTO.Reserva
                            {
                                IDReserva = c.IDReserva,
                                IDCliente = c.IDCliente,
                                IDPartida = c.IDPartida,
                                IDChegada = c.IDChegada,
                                IDTransporteIda = c.IDTransporteIda,
                                IDTransporteVolta = c.IDTransporteVolta,
                                IDAgencia = c.IDAgencia,
                                IDAlojamento = c.IDAlojamento,
                                nrPessoas = c.nrPessoas,
                                dataReserva = c.dataReserva,
                                dataPartida = c.dataPartida,
                                dataChegada = c.dataChegada

                            }).ToList();

            return reservas;
        }

        public void insert(BTO.Reserva toInsert)
        {
            try
            {
                //cria um entity model e guarda
                var reservaEntities = new TISModel.TISEntities();

                TISModel.Reserva reserva = new TISModel.Reserva();
                
                reserva.IDCliente = toInsert.IDCliente;
                reserva.IDPartida = toInsert.IDPartida;
                reserva.IDChegada = toInsert.IDChegada;
                reserva.IDTransporteIda = toInsert.IDTransporteIda;
                reserva.IDTransporteVolta = toInsert.IDTransporteVolta;
                reserva.IDAgencia = toInsert.IDAgencia;
                reserva.IDAlojamento = toInsert.IDAlojamento;
                reserva.nrPessoas = toInsert.nrPessoas;
                reserva.dataReserva = toInsert.dataReserva;
                reserva.dataPartida = toInsert.dataPartida;
                reserva.dataChegada = toInsert.dataChegada;

                reservaEntities.AddToReserva(reserva);
                reservaEntities.SaveChanges();

            }
            catch (Exception)
            {
                throw new System.Exception("Não foi possível inserir a reserva!");
            }
        }

        public void update(BTO.Reserva toUpdate)
        {
            var reservaEntities = new TISModel.TISEntities();
            var reserva = (from c in reservaEntities.Reserva where c.IDReserva == toUpdate.IDReserva select c).FirstOrDefault();
            
            if (reserva != null)
            {
                try
                {
                    reserva.IDCliente = toUpdate.IDCliente;
                    reserva.IDPartida = toUpdate.IDPartida;
                    reserva.IDChegada = toUpdate.IDChegada;
                    reserva.IDTransporteIda = toUpdate.IDTransporteIda;
                    reserva.IDTransporteVolta = toUpdate.IDTransporteVolta;
                    reserva.IDAgencia = toUpdate.IDAgencia;
                    reserva.IDAlojamento = toUpdate.IDAlojamento;
                    reserva.nrPessoas = toUpdate.nrPessoas;
                    reserva.dataReserva = toUpdate.dataReserva;
                    reserva.dataPartida = toUpdate.dataPartida;
                    reserva.dataChegada = toUpdate.dataChegada;

                    reservaEntities.SaveChanges();
                }
                catch (Exception)
                {
                    throw new System.Exception("Não foi Possível actualizar a reserva!");
                }
            }
            else {
                throw new System.Exception("Reserva não encontrada!");
            }

            
        }

        public void delete(int id)
        {
            var reservaEntities = new TISModel.TISEntities();
            var reserva = (from c in reservaEntities.Reserva where c.IDReserva == id select c).FirstOrDefault();

            if (reserva != null)
            {
                try
                {
                    reservaEntities.DeleteObject(reserva);
                    reservaEntities.SaveChanges();
                }
                catch (Exception)
                {
                    throw new System.Exception("Não foi Possível remover a reserva!");
                }                
            }
            else
            {
                throw new System.Exception("Reserva não encontrada!");
            }

        }
    }
}
